package com.itany.corejava.code02_运算符;

/**
 * @author 石小俊
 * @date 2023年08月10日 13:33
 */
public class Test08_位运算符 {
    public static void main(String[] args) {
        int num1 = 5, num2 = 8;
        // num1二进制补码:00000000 00000000 00000000 00000101
        // num2二进制补码:00000000 00000000 00000000 00001000
        // 00000000 00000000 00000000 00000000
        // 最终的值为0
        System.out.println(num1 & num2);

        // num1二进制补码:00000000 00000000 00000000 00000101
        // num2二进制补码:00000000 00000000 00000000 00001000
        // 最终运算的结果:00000000 00000000 00000000 00001101
        // 1+0+4+8=13
        System.out.println(num1 | num2);

        // num1二进制补码:00000000 00000000 00000000 00000101
        // 最终运算的结果:11111111 11111111 11111111 11111010 补码
        // 反码:11111111 11111111 11111111 11111001
        // 原码:10000000 00000000 00000000 00000110
        // -6
        System.out.println(~num1);
        // num2二进制补码:00000000 00000000 00000000 00001000
        // 最终运算的结果:11111111 11111111 11111111 11110111
        // 反码:11111111 11111111 11111111 11110110
        // 原码:10000000 00000000 00000000 00001001
        // -9
        System.out.println(~num2);

        // num1二进制补码:00000000 00000000 00000000 00000101
        // num2二进制补码:00000000 00000000 00000000 00001000
        // 最终运算的结果:00000000 00000000 00000000 00001101
        // 1+4+8=13
        System.out.println(num1 ^ num2);

        // num1二进制补码:00000000 00000000 00000000 00000101
        // 00000000 00000000 00000000 00010100
        // 4+16 = 20
        System.out.println(num1 << 2);
        // num2二进制补码:00000000 00000000 00000000 00001000
        // 00000000 00000000 00000000 01000000
        System.out.println(num2 << 3);

        // num1二进制补码:00000000 00000000 00000000 00000101
        // 00000000 00000000 00000000 00000001
        System.out.println(num1 >> 2);

        // -8的二进制原码:10000000 00000000 00000000 00001000
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 右移2位:11111111 11111111 11111111 11111110
        // 反码:11111111 11111111 11111111 11111101
        // 原码:10000000 00000000 00000000 00000010
        System.out.println(-8 >> 2);

        System.out.println(num1 >>> 2);

        // -8的二进制原码:10000000 00000000 00000000 00001000
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 右移2位:00111111 11111111 11111111 11111110
        // 原码:00111111 11111111 11111111 11111110
        System.out.println(-8 >>> 2);
    }
}
